home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / FINGERD.C < prev    next >
C/C++ Source or Header  |  1997-07-30  |  10KB  |  385 lines

  1. /* Internet Finger server */
  2. /* Mods by KO4KS */
  3. #include "global.h"
  4. #include "commands.h"
  5. #include "files.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "session.h"
  9. #include "mailbox.h"
  10.  
  11. #if !defined(_lint)
  12. static char rcsid[] OPTIONAL = "$Id: fingerd.c,v 1.21 1997/07/31 00:44:20 root Exp root $";
  13. #endif
  14.  
  15. static int Sfinger = -1;    /* Prototype socket for service */
  16. static void fingerd (int s,void *unused,void *p);
  17. #if defined(CALLBOOK) || defined(CALLSERVER) || defined(SAMCALLB) || defined(QRZCALLB)
  18. extern int Scallbook;
  19. #endif
  20.  
  21. extern int Sconv;
  22. extern int Sftp;    /* Prototype socket for service */
  23. extern int BbsUsers, FtpUsers;
  24. #if defined(SCREENSAVER) || defined(TUTOR)
  25. extern int Tutored;
  26. #endif
  27.  
  28. extern int cb_lookup (int, char *, FILE *);
  29.  
  30. #ifdef MBFWD
  31. extern void forwardingSummary (void);
  32. #endif
  33. extern int donrroute (int argc,char *argv[],void *p);
  34. extern int dotcpview (int argc,char *argv[],void *p);
  35. extern int donrstatus (int argc,char *argv[],void *p);
  36. extern int dombpast (int argc,char *argv[],void *p);
  37. extern int domflist (int argc,char *argv[],void *p);
  38. extern int dombmailstats (int argc,char *argv[],void *p);
  39. extern int dombstatus (int argc,char *argv[],void *p);
  40. #if !defined(UNIX) && !defined(TNOS_68K)
  41. extern int domemstat (int argc,char *argv[],void *p);
  42. #endif
  43. #ifdef FOQ_CMDS
  44. extern int dombfinger (int argc,char *argv[],void *p);
  45. #endif
  46.  
  47. /* Start up finger service */
  48. int
  49. finstart(argc,argv,p)
  50. int argc;
  51. char *argv[];
  52. void *p OPTIONAL;
  53. {
  54.     return (installserver (argc, argv, &Sfinger, "Finger listener", IPPORT_FINGER,
  55.         INADDR_ANY, "fingerd", fingerd, 1024, NULL));
  56. }
  57.  
  58.  
  59. #define FLINE 128
  60. #define FPT int (*)(int argc,char *argv[],void *p)
  61.  
  62. static struct finger_cmds {
  63.     const char *name;        /* Name of command */
  64.     const char *description;    /* Brief description of command */
  65.     int (*func) (int argc,char *argv[],void *p);
  66.                 /* Function to execute command */
  67.     int savestate;        /* Whether to save state and send null args */
  68.     int arg;        /* numberic value to pass if non-savestate */
  69. } fingercmds[] = {
  70. #ifdef AX25
  71.     { "aheard",    "AX25 heard data",    doaxheard,    1,    0},
  72. #endif
  73. #ifdef ASY
  74.     { "asystat",    "Async port data",    doasystat,    1,    0},
  75. #endif
  76. #ifdef AX25
  77.     { "ax25",    "AX25 status",        doaxstat,    1,    0},
  78. #endif
  79. #ifdef MAILBOX
  80.     { "bbs",    "BBS users and status",    0,        0,    0},
  81. #endif
  82. #ifdef CONVERS
  83.     { "conf",    "Conference users",    0,        0,    0},
  84. #endif
  85. #ifdef STATS_MSG
  86.     { "daily_msg",    "Daily Message stats",    STATdaily_msg,    1,    0},
  87. #endif
  88. #ifdef STATS_TFC
  89.     { "daily_tfc",    "Daily Traffic stats",    STATdaily_tfc,    1,    0},
  90. #endif
  91. #ifdef STATS_USE
  92.     { "daily_use",    "Daily Usage stats",    STATdaily_use,    1,    0},
  93. #endif
  94. #ifdef MBFWD
  95.     { "fwd_queue",    "Forwarding Queue", (FPT)forwardingSummary,1,    0},
  96. #endif
  97. #ifdef STATS_MSG
  98.     { "general_msg","General Message stats",STATgeneral_msg,1,    0},
  99. #endif
  100. #ifdef STATS_TFC
  101.     { "general_tfc","General Traffic stats",STATgeneral_tfc,1,    0},
  102. #endif
  103. #ifdef STATS_USE
  104.     { "general_use","General Usage stats",    STATgeneral_use,1,    0},
  105. #endif
  106.     { "iheard",    "IP heard data",    doipheard,    1,    0},
  107.     { "info",    "TNOS info",        doversion,    1,    0},
  108. #ifdef AX25
  109.     { "jheard",    "AX25 heard data",    doaxheard,    1,    0},
  110. #endif
  111. #ifdef CONVERS
  112.     { "links",    "Conference Links", (FPT)ShowConfLinks,    0,    1},
  113. #endif
  114. #if defined(MAILFOR) && defined(AX25) && defined(MAILBOX)
  115.     { "mailfor",    "BBS mailfor data",    domflist,    1,    0},
  116. #endif
  117. #if !defined(UNIX) && !defined(TNOS_68K)
  118.     { "memstat",    "TNOS memory data",    domemstat,    1,    0},
  119. #endif
  120. #ifdef STATS_MSG
  121.     { "monthly_msg","Monthly Message stats",STATmonthly_msg,1,    0},
  122. #endif
  123. #ifdef STATS_TFC
  124.     { "monthly_tfc","Monthly Traffic stats",STATmonthly_tfc,1,    0},
  125. #endif
  126. #ifdef STATS_USE
  127.     { "monthly_use","Monthly Usage stats",    STATmonthly_use,1,    0},
  128. #endif
  129. #ifdef MAILBOX
  130.     { "mpast",    "BBS past users",    dombpast,    1,    0},
  131.     { "mstat",    "BBS mailbox stats",    dombmailstats,    1,    0},
  132. #endif
  133. #ifdef NETROM
  134.     { "netrom",    "Netrom status",    donrstatus,    1,    0},
  135.     { "nodes",    "Netrom nodes",        donrroute,    1,    0},
  136. #endif
  137. #ifdef GATECMDS
  138.     { "ports",    "Available ports",    dombports,    1,    0},
  139. #endif
  140. #ifdef RIP
  141.     { "ripstat",    "RIP status data",    doripstat,    1,    0},
  142. #endif
  143.     { "socket",    "TNOS active sockets",    dosock,        1,    0},
  144. #if defined(MAILBOX) || defined (CONVERS)
  145.     { "stat",    "BBS/Conference status",0,        0,    0},
  146. #endif
  147.     { "tcpview",    "TCP view of bytes",    dotcpview,    1,    0},
  148. #ifdef MAILBOX
  149.     { "users",    "BBS users online",    dombstatus,    1,    0},
  150. #endif
  151.     { "uptime",    "System Uptime",    douptime,    1,    0},
  152.     { "version",    "TNOS version info",    doversion,    1,    0},
  153. #ifdef STATS_MSG
  154.     { "weekly_msg",    "Weekly Message stats",    STATweekly_msg,    1,    0},
  155. #endif
  156. #ifdef STATS_TFC
  157.     { "weekly_tfc",    "Weekly Traffic stats",    STATweekly_tfc,    1,    0},
  158. #endif
  159. #ifdef STATS_USE
  160.     { "weekly_use",    "Weekly Usage stats",    STATweekly_use,    1,    0},
  161. #endif
  162. #ifdef STATS_MSG
  163.     { "yearly_msg",    "Yearly Message stats",    STATyearly_msg,1,    0},
  164. #endif
  165. #ifdef STATS_TFC
  166.     { "yearly_tfc",    "Yearly Traffic stats",    STATyearly_tfc,1,    0},
  167. #endif
  168. #ifdef STATS_USE
  169.     { "yearly_use",    "Yearly Usage stats",    STATyearly_use,1,    0},
  170. #endif
  171.     { NULLCHAR,    "",            NULL,        0,    0}
  172. };
  173.  
  174.  
  175. static void
  176. fingerd(s,unused,p)
  177. int s;
  178. void *unused OPTIONAL;
  179. void *p OPTIONAL;
  180. {
  181. char user[80], *uptr;
  182. int ulen,found;
  183. FILE *fp;
  184. char *file,*cp;
  185. char line[FLINE+1];
  186. int dotheconf = 0, dothebbs = 0;
  187. int outsave;
  188. #ifdef USERLOG
  189. char *newargv[2];
  190. #endif
  191. struct finger_cmds *cmd;
  192.  
  193.     (void) sockmode(s,SOCK_ASCII);
  194.     (void) sockowner(s,Curproc);
  195.     log(s,"open Finger");
  196.     if (recvline(s, (unsigned char *) user,80) == -1)
  197.         return;
  198.     rip(user);
  199.     uptr = skipwhite(user);
  200.     ulen = (int) strlen(uptr);
  201.     if (ulen)    {
  202. #ifdef MSDOS
  203.             if (!strcmp (uptr, "con") || !strcmp (uptr, "aux"))    {
  204.                 usprintf (s, "Can't finger '%s'... DOS Reserved Device Name\n", uptr);
  205.             goto done;
  206.         }
  207. #endif
  208. #ifdef CONVERS
  209.             if (!stricmp (uptr, "conf") || !stricmp (uptr, "stat"))
  210.                 dotheconf = 1;
  211. #endif
  212.             if (!stricmp (uptr, "bbs") || !stricmp (uptr, "stat"))
  213.                 dothebbs = 1;
  214.     }
  215.  
  216. #ifdef FOQ_CMDS
  217.     /* handle a user%host request */
  218.     if ((cp = strrchr(uptr, '%')) != NULLCHAR)    {
  219.         struct mbx m;
  220.         char *myargv[2];
  221.         int old;
  222.         *cp = '@';
  223.         myargv[1] = uptr;
  224.         strcpy(m.name, "fingerd");
  225.         m.user = s;
  226.         m.privs = TELNET_CMD + AMPR_CMD + NO_ESCAPE + SYS_CHAT + ALL_AREAS;
  227.         old = Curproc->output;
  228.         Curproc->output = s;
  229.         (void) dombfinger(2, myargv, &m);
  230.         Curproc->output = old;
  231.         goto done;
  232.     }
  233. #endif
  234.  
  235.     /* handle the pseudo users */
  236.     for (cmd = fingercmds; cmd->name; cmd++)    {
  237.         if (ulen && !strcmp(uptr, cmd->name))
  238.             break;
  239.     }
  240.     if (cmd->name && cmd->func)    {
  241.         usprintf(s, "%s at %s\n\n", cmd->description, Hostname);
  242.         if (cmd->savestate)    {
  243.             outsave = Curproc->output;
  244.             Curproc->output = s;
  245.             (void) (*cmd->func)(1,NULLCHARP,NULL);
  246.             Curproc->output = outsave;
  247.         } else
  248.             (void) (*cmd->func)(s, (char **)cmd->arg, (void *)0);
  249.     } else if (dotheconf || dothebbs)    {
  250.         usprintf (s, "Current Status at %s\n\n", Hostname);
  251.             if (dothebbs)    {
  252.                 if (!BbsUsers)
  253.                 usputs (s, "No users currently on the BBS\n");
  254.             else if (Listusers != NULL)    {
  255.                     usputs (s, "Bulletin Board ");
  256.                 (*Listusers)(s);
  257.             }
  258.             if (dothebbs
  259. #ifdef CONVERS
  260.                 && dotheconf
  261. #endif
  262.                 )    {
  263.  
  264.                 if (Sftp == -1)
  265.                     usprintf (s, "\nFTP Server not started\n");
  266.                 else
  267.                     usprintf (s, "\nThere are %d in FTP Sessions\n", FtpUsers);
  268. #ifdef TUTOR
  269.                 usprintf (s, "There are %d in Information Server Sessions\n", Tutored);
  270. #endif
  271.                 usputs (s, "\n");
  272.             }
  273.             if (dothebbs)    {
  274.                 outsave = Curproc->output;
  275.                 Curproc->output = s;
  276.                 (void) dombmailstats(0,NULLCHARP,NULL);
  277.                 Curproc->output = outsave;
  278.             }
  279.         }
  280. #ifdef CONVERS
  281.         if (dotheconf)    {
  282.             if(Sconv == -1)
  283.                 usputs(s,"Conference not started\n");
  284.             else    {
  285.                 usputs (s, "Conference Bridge Users:\n");
  286.                 (void) ShowConfUsers(s, NULLCHAR);
  287.             }
  288.         }
  289. #endif
  290.         
  291.     } else {
  292.         if(ulen == 0){
  293.             char buffer[128];
  294. #ifdef MSDOS
  295.             sprintf (buffer, "%s/*.", FingerDir);
  296. #else
  297.             sprintf (buffer, "%s/*", FingerDir);
  298. #endif
  299.             fp = dir(buffer,-1);
  300.             if(fp == NULLFILE)
  301.                 usprintf(s,"No finger information available\n");
  302.             else
  303.                 usprintf(s,"Known users on this system:\n");
  304.         } else {
  305. #ifdef SAMCALLB
  306.             cb_lookup (s, uptr, (FILE *) 0);
  307. #endif
  308. #ifdef USERLOG
  309.             outsave = Curproc->output;
  310.             Curproc->output = s;
  311.             newargv[1] = uptr;
  312.             (void) dombuserinfo(0,newargv,NULL);
  313.             Curproc->output = outsave;
  314. #endif
  315.             file = pathname(FingerDir,uptr);
  316.             cp = pathname(FingerDir,"");
  317.             /* Check for attempted security violation (e.g., somebody
  318.              * might be trying to finger "../ftpusers"!) */
  319.             if(strncmp(file,cp,strlen(cp)) != 0){
  320.                 fp = NULLFILE;
  321.                 usprintf(s,"Invalid user name %s\n",uptr);
  322.             } else if((fp = fopen(file,READ_TEXT)) == NULLFILE)    {
  323.                 /* Now search the finger database file for this user - WG7J */
  324.                 found = 0;
  325.                 if((fp = fopen(Fdbase,READ_TEXT)) != NULLFILE) {
  326.                     while(fgets(line,FLINE,fp) != NULLCHAR)
  327.                         if(!strnicmp(line,uptr,(unsigned)ulen)) {
  328.                             usprintf(s,"%s", line);
  329.                             while(fgets(line,FLINE,fp) != NULLCHAR)    {
  330.                                 if (line[1] && *line != ' ' && *line != '\t')
  331.                                     break;
  332.                                 else
  333.                                     usprintf (s, line);
  334.                             }
  335.                             found = 1;
  336.                             break;
  337.                         }
  338.                     (void) fclose(fp);
  339.                     fp = NULLFILE;
  340.                 }
  341.                 if(!found)
  342.                     usprintf(s,"No user info for %s\n",uptr);
  343. #if defined(SAMCALLB) || defined(QRZCALLB)
  344.                 if (Scallbook != -1)    {
  345.                                 usprintf(s,"\nThe callbook reports:");
  346.                     (void) cb_lookup (s, uptr, (FILE *) 0);
  347.                         }
  348. #endif
  349.             }
  350.             free(cp);
  351.             free(file);
  352.         }
  353.         if(fp != NULLFILE){
  354.             (void) sendfile(fp,s,ASCII_TYPE,0);
  355.             (void) fclose(fp);
  356.         }
  357.     }
  358.     if(!ulen)    {
  359.         usputs (s, "\n*** Additional information available by fingering:\n");
  360.         for (cmd = fingercmds; cmd->name; cmd++)
  361.             usprintf (s, "     %-14.14s - %s\n", cmd->name, cmd->description);
  362.  
  363.         if(Listusers != NULL)    {
  364.                 usputs (s, "\n");
  365.             (*Listusers)(s);
  366.         }
  367.     }
  368. #if defined(FOQ_CMDS) || defined(MSDOS)
  369. done:
  370. #endif
  371.     close_s(s);
  372.     log(s,"close Finger");
  373. }
  374.  
  375. int
  376. fin0(argc,argv,p)
  377. int argc OPTIONAL;
  378. char *argv[] OPTIONAL;
  379. void *p OPTIONAL;
  380. {
  381.     return (deleteserver (&Sfinger));
  382. }
  383.  
  384.  
  385.